package com.rpframework.module.common.bottom.sms;

import com.rpframework.core.json.PhoneExistException;
import com.rpframework.core.json.PhoneNotExistException;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;


/**
 * 短信模板
 *
 * @author 刘兴
 */
public class SmsTemplate {
    /**
     * 模板内容
     */
    private static final Map<String, String> TEMPLATE_MAP = new HashMap<>();

    private static final Map<Object, Boolean> e = new HashMap<>();

    static {
        TEMPLATE_MAP.put("0", "本次注册验证码[??]");
        TEMPLATE_MAP.put("1", "本次修改密码验证码[??]");
        TEMPLATE_MAP.put("2", "本次修改手机验证码[??]");
        TEMPLATE_MAP.put("3", "本次修改支付密码验证码[??]");
        TEMPLATE_MAP.put("4", "本次修改新手机号码验证码[??]");
        TEMPLATE_MAP.put("5", "您好，您的验证码为[??]，请注意保管。");
        TEMPLATE_MAP.put("6", "本次修改支付密码的手机验证码是[??]");

        e.put("0", true);
        e.put("1", false);
        e.put("2", false);
        e.put("3", false);
        e.put("4", true);
        e.put("5", true);
    }

    /**
     * 获取短信模板内容
     *
     * @param type 模板类型
     * @return 模板内容
     */
    private static String getTemplate(String type) {
        return TEMPLATE_MAP.get(type);
    }

    /**
     * 检测手机号码是否存在
     *
     * @param exist 是否存在
     * @param id    模板主键
     */
    public static void exist(Boolean exist, Object id) {
        Boolean aBoolean = e.get(id);
        if (aBoolean != null) {
            if (aBoolean) {
                if (exist) {
                    throw new PhoneExistException();
                }
            } else {
                if (!exist) {
                    throw new PhoneNotExistException();
                }
            }
        }
    }

    /**
     * 获取模板替换占位
     *
     * @param type 类型
     */
    public static SmsContentCode getTemplateCode(String type) {
        String template = getTemplate(type);
        if (StringUtils.isBlank(template)) {
            return null;
        }
        SmsContentCode smsContentCode = new SmsContentCode();
        if (template.contains(position())) {
            Integer random = random(4);
            smsContentCode.setCode(random);
            template = template.replace("[??]", random + "");
        }
        smsContentCode.setContent(template);
        return smsContentCode;
    }

    /**
     * 获取count个随机数
     *
     * @param count 随机数个数
     * @return 随机数
     */
    private static String randomString(int count) {
        StringBuilder sb = new StringBuilder();
        String str = "0123456789";
        Random r = new Random();
        for (int i = 0; i < count; i++) {
            int num = r.nextInt(str.length());
            sb.append(str.charAt(num));
            str = str.replace((str.charAt(num) + ""), "");
        }
        return sb.toString();
    }

    /**
     * 获取count个随机数
     *
     * @param count 随机数个数
     * @return 随机数
     */
    public static Integer random(int count) {
        return Integer.parseInt(randomString(count));
    }

    /**
     * 替换位置
     *
     * @return 替换位置字符
     */
    public static String position() {
        return "[??]";
    }

    /**
     * 短信内容和验证码
     *
     * @author 刘兴
     */
    public static class SmsContentCode {
        /**
         * 短信内容
         */
        private String content;
        /**
         * 验证码
         */
        private Integer code;

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public Integer getCode() {
            return code;
        }

        public void setCode(Integer code) {
            this.code = code;
        }
    }
}
